#include "lwip/debug.h"
#include "lwip/stats.h"
#include "lwip/tcp.h"
#include "lwip.h"
#include "lwip/api.h"
#include "tcp.h"
#include "main.h"
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

void tcp_client_init(void)
{
	
	uint8_t   Server_IP[4] = {192,168,0,11};
	uint16_t  Server_Port  = 8087;
	struct  netconn  *conn;
	ip_addr_t  ipaddr;
	err_t  err = ERR_OK;
	struct netbuf  *rx_buff;
	void  *rx_data;
	uint16_t  rx_data_len;
	char  connect_ok[64] = "Successfully connected to Server!\r\n";
	
	// 将数组Server_IP中IP地址转换合并到ipaddr中
	IP4_ADDR(&ipaddr, Server_IP[0], Server_IP[1], Server_IP[2], Server_IP[3]);
	
  /* Infinite loop */
  for(;;)
  {
    conn = netconn_new(NETCONN_TCP);    // 创建新的连接结构conn
		if(conn == NULL)
		{
			osDelay(1000);
			continue;
		}
		netif_set_link_up(netif_default);
		err = netconn_connect(conn, &ipaddr, Server_Port);  // 连接服务器
		if(err != ERR_OK)
		{
			osDelay(1000);
			netconn_delete(conn);  // 删除连接结构体conn
			continue;
		}
		printf("State: %d\r\n", conn->state);
		netconn_write(conn, connect_ok, strlen(connect_ok), NETCONN_COPY);
		
		while(netconn_recv(conn, &rx_buff) == ERR_OK) // 从服务器接收数据，LWIP默认阻塞式接收
		{
			do 
			{
				netbuf_data(rx_buff, &rx_data, &rx_data_len); 			// 从接收结构体rx_buff中拷贝数据到rx_data
				netconn_write(conn, rx_data, rx_data_len, NETCONN_COPY);  // 向服务器发送消息
				printf("%.*s\r\n",(int)rx_data_len, (const char*)rx_data);
				memset(rx_data, 0, rx_data_len);
      } 
			while(netbuf_next(rx_buff) >= 0);		// netbuf中还有数据时 调用netbuf_next函数移动ptr指针指向下一个pbuf
			netbuf_delete(rx_buff);							// 删除接收结构体rx_buff
		}
		netbuf_delete(rx_buff);  // 删除接收结构体rx_buff	只有当服务器关闭或出现其他错误才会运行到这里
		netconn_close(conn);     // 关闭连接到的服务器
		netconn_delete(conn);    // 删除连接结构conn
		printf("Close connection!\r\n");
		
    osDelay(10);
  }
}
